package algorithm.class2;

import algorithm.ArrUtil;

/**
 * @ Description：给定一个方法f等概率返回1～5，仅使用f方法等概率返回1～7
 */
public class _05MathRandom {

    /**
     * 等概率返回[1,5]之间的一个整数
     *
     * @return
     */
    private static int f() {
        return (int) (Math.random() * 5) + 1;
    }

    /**
     * 等概率返回[0,1]之间的一个整数,即0，1发生器
     */
    private static int f1() {
        int i = 0;
        do {
            i = f();
        } while (i == 3);
        return i > 3 ? 1 : 0;
    }

    /**
     * 等概率返回[0,6]之间的一个整数
     *
     * @return
     */
    private static int f2() {
        int i = 0;
        do {
            i = (f1() << 2) + (f1() << 1) + f1();
        } while (i == 7);
        return i;
    }

    private static int f3() {
        return f2() + 1;
    }

    private static void checkF() {
        int times = 10000000;
        int[] results = new int[8];
        for (int i = 0; i < times; i++) {
            results[f3()]++;
        }
        ArrUtil.print(results);
    }

    public static void main(String[] args) {
        checkF();
    }
}
